package beans.cadastro.financeiro;

import java.util.Collections;
import java.util.Date;
import java.util.List;
import javax.faces.component.UICommand;
import javax.persistence.EntityExistsException;
import javax.persistence.EntityManager;
import javax.persistence.Persistence;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import pojo.cadastro.financeiro.TipoLancamento;

/**
 *
 * @author WAND
 */
public class TipoLancamentoBean {

    @PersistenceContext
    private EntityManager mgr;

    // pojo
    private long id;
    private String descricao;
    private boolean despesa;
    private boolean receita;

    // Campos de Pesquisa
    private String descricaoPesq;
    private boolean despesaPesq;
    private boolean receitaPesq;

    // listas
    private List<TipoLancamento> listaTipoLancamento;

    // botoes de comandos
    private UICommand btnAlterar;
    private UICommand btnExcluir;

    public TipoLancamentoBean() {
    }

    public String pesquisar() {
        carregar();
        return "pesquisa";
    }

    public String retornar() {
        return "pesquisa";
    }

    public String carregar() {

        listaTipoLancamento = Collections.EMPTY_LIST;
        String sql = "SELECT tl FROM TipoLancamento tl WHERE tl.id IS NOT NULL ";
        if (!this.descricaoPesq.equals(""))
            sql += "AND tl.descricao LIKE :descricaoPesq ";
        if (this.despesaPesq)
            sql += "AND tl.despesa = :despesaPesq ";
        if (this.receitaPesq)
            sql += "AND tl.receita = :receitaPesq ";
        sql += "ORDER BY tl.descricao";

        mgr = Persistence.createEntityManagerFactory("lojaPU").createEntityManager();
        Query q1 = mgr.createQuery(sql);

        if (!this.descricaoPesq.equals(""))
            q1.setParameter("descricaoPesq", "%"+this.descricaoPesq+"%");

        if (this.despesaPesq)
            q1.setParameter("despesaPesq", true);

        if (this.receitaPesq)
            q1.setParameter("receitaPesq", true);

        listaTipoLancamento = q1.getResultList();
        mgr.close();

        return null;
    }

    public String salvar() {
        TipoLancamento tl = new TipoLancamento();

        if (id != 0) {
            tl.setId(id);
        }

        tl.setDescricao(this.descricao);
        tl.setDespesa(this.despesa);
        tl.setReceita(this.receita);
        tl.setDataCadastro(new Date(System.currentTimeMillis()));

        mgr = Persistence.createEntityManagerFactory("lojaPU").createEntityManager();
        mgr.getTransaction().begin();
        try {
            if (tl.getId() == 0) {
                mgr.persist(tl);
            } else {
                mgr.merge(tl);
            }
            mgr.getTransaction().commit();
        } catch (EntityExistsException e) {
            mgr.getTransaction().rollback();
        } finally {
            mgr.close();
        }

        listaTipoLancamento = Collections.EMPTY_LIST;

        return "pesquisa";
    }

    public String incluir() {
        id = 0;
        descricao = "";
        despesa = false;
        receita = false;

        return "cadastro";
    }

    public String alterar() {
        mgr = Persistence.createEntityManagerFactory("lojaPU").createEntityManager();
        TipoLancamento tl = mgr.find(TipoLancamento.class, Long.parseLong(btnAlterar.getValue().toString()));

        id = tl.getId();
        descricao = tl.getDescricao();
        despesa = tl.getDespesa();
        receita = tl.getReceita();

        return "cadastro";
    }

    public String excluir() {
        mgr = Persistence.createEntityManagerFactory("lojaPU").createEntityManager();
        TipoLancamento tl = mgr.find(TipoLancamento.class, Long.parseLong(btnExcluir.getValue().toString()));

        mgr.getTransaction().begin();
        try {
            mgr.remove(tl);
            mgr.getTransaction().commit();
        } catch (EntityExistsException e) {
            mgr.getTransaction().rollback();
        } finally {
            mgr.close();
        }
        carregar();

        return null;
    }

    // Getters and Setters

    public UICommand getBtnAlterar() {
        return btnAlterar;
    }

    public void setBtnAlterar(UICommand btnAlterar) {
        this.btnAlterar = btnAlterar;
    }

    public UICommand getBtnExcluir() {
        return btnExcluir;
    }

    public void setBtnExcluir(UICommand btnExcluir) {
        this.btnExcluir = btnExcluir;
    }

    public String getDescricao() {
        return descricao;
    }

    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }

    public String getDescricaoPesq() {
        return descricaoPesq;
    }

    public void setDescricaoPesq(String descricaoPesq) {
        this.descricaoPesq = descricaoPesq;
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public List<TipoLancamento> getListaTipoLancamento() {
        return listaTipoLancamento;
    }

    public void setListaTipoLancamento(List<TipoLancamento> listaTipoLancamento) {
        this.listaTipoLancamento = listaTipoLancamento;
    }

    public boolean isDespesa() {
        return despesa;
    }

    public void setDespesa(boolean despesa) {
        this.despesa = despesa;
    }

    public boolean isReceita() {
        return receita;
    }

    public void setReceita(boolean receita) {
        this.receita = receita;
    }

    public boolean isDespesaPesq() {
        return despesaPesq;
    }

    public void setDespesaPesq(boolean despesaPesq) {
        this.despesaPesq = despesaPesq;
    }

    public boolean isReceitaPesq() {
        return receitaPesq;
    }

    public void setReceitaPesq(boolean receitaPesq) {
        this.receitaPesq = receitaPesq;
    }
    
}
